En Ruby, la entrada/salida no es solo un conjunto de comandos; es una arquitectura sofisticada arquitectura basada en flujos. En el núcleo de este sistema se encuentra la IO clase, que actúa como un canal bidireccional entre tu programa y el mundo exterior. Ya sea que interactúes con un archivo, un socket de red o la terminal del usuario, Ruby los trata como flujos genéricos.
1. El puente bidireccional
Un IO objeto es una abstracción unificada. Mientras que el sistema operativo ve distintos descriptores de archivos para lectura y escritura (como en una tubería), Ruby los encapsula en un único objeto. Esto permite un flujo de datos sin interrupciones en ambas direcciones.
2. Kernel y filtros estándar
El Kernel módulo proporciona métodos como gets y print. Estos son esencialmente filtros que delegan a las constantes globales STDIN y STDOUT. Esto significa que tu código puede redirigirse a nivel del sistema operativo para procesar archivos o flujos de red sin cambiar ni una sola línea de lógica.
$$\text{Flujo} \rightarrow \text{Buffer} \rightarrow \text{Interprete de Ruby}$$